//
//  WBNetworkManager.swift
//  czWB
//
//  Created by Qing on 2018/7/17.
//  Copyright © 2018年 成哥哥. All rights reserved.
//

import UIKit
import AFNetworking
import SVProgressHUD

/// AFN发起网络请求用的get/post
enum WBMethou {
    case GET
    case POST
}

/// AFN网络请求
class WBNetworkManager: AFHTTPSessionManager {
    
    /*如果请求出现3840错误， 就是下面这个写法
    /// 网络请求单例
    static let shared: WBNetworkManager = {

//        不加这两个属性网络请求会出错,code=3840
        let shareds = WBNetworkManager()
        shareds.responseSerializer = AFHTTPResponseSerializer()
        shareds.requestSerializer = AFHTTPRequestSerializer()
        return shareds
    }()
    */
    
    /// 网络请求单例
    static let shared = WBNetworkManager()
    
    /// 访问令牌，所有的网络请求，都基于此令牌（登录除外）
//    var accessToeken: String?// = "2.00bHuOpG7pz8pC0b6d9f4c0cEA71kC"
    
//    var uid: String? = "2592531328"
    
    /// 用户帐户信息属性
    lazy var userAcount = WBUserAccount()
    
    /// 用户是否登录标志
    var userLogon: Bool {
        
        return userAcount.access_token != nil
        
    }
    
    /// 专门负责拼接token的网络请求方法
    func tokenRequest(Methou: WBMethou = .GET, url: String, paramenters: [String: Any]?, completion: @escaping (_ json: Any?, _ isSuccess: Bool) -> ())  {
        
//        1.判断token是否为空，如果为空则直接返回
        guard let token = userAcount.access_token else {
            
            completion(nil, false)
            
            //            FIXME: 发送通知，提示用户登录
            print("token为空，请登录")
            
            NotificationCenter.default.post(name: NSNotification.Name.init(WBUserShouldLoginNotification), object: nil)
            
            return
        }
        
//        2.判断字典是否存在，如果为nil，则为字典分配空间
        var paramenters = paramenters
        if paramenters == nil {
            paramenters = [String: Any]()
        }
        
//        3.设置字典参数，此处paramenters一定有值
        paramenters!["access_token"] = token
        
//        调用request发起真正的网络请求
        request(url: url, paramenters: paramenters, completion: completion)
    }
    
    /// AFN网络请求方法
    ///
    /// - Parameters:
    ///   - Methou: 请求方式，枚举.GET/.POST
    ///   - url: 请求网址
    ///   - paramenters: 请求参数/字典
    ///   - completion: 回调
    func request(Methou: WBMethou = .GET, url: String, paramenters: [String: Any]?, completion: @escaping (_ json: Any?, _ isSuccess: Bool) -> ())  {
        
//        成功的回调
        let success = {
            (task: URLSessionDataTask, json: Any? ) -> () in
            completion(json, true)
        }
//        失败的回调
        let failure = {
            (task: URLSessionDataTask?, error: Error) -> () in
            
            completion(error, false)
            
//            1.URLSessionDataTask是网络请求失败的数据，记录了请求过程的记录，可以拿到请求的错误代号
//            2.判断错误代号的处理反馈给用户
//            如果是微博测试用户(应用未提交审核)每天请求数据会有限制
//            但不会有任何提示，报错也是403，解决方法：新开通一个应用对接数据测试
            if (task?.response as? HTTPURLResponse)?.statusCode == 403 {
                print("statusCode == 403 网络错误，请重新登录")
//              发送登录通知，在登录后，使用微博期间token过期，这里会接收登录通知、
                NotificationCenter.default.post(name: NSNotification.Name.init(WBUserShouldLoginNotification), object: "bad token")
            }
            
        }
        
//        默认值是.get,如果不是get就是post
        if Methou == .GET {
            get(url, parameters: paramenters, progress: nil, success: success, failure: failure)
        } else {
            post(url, parameters: paramenters, progress: nil, success: success, failure: failure)
        }
    }
    

}
